function _ctPwGenChars(opts) { var pools = []; if (opts.lower) pools.push('abcdefghijklmnopqrstuvwxyz'); if (opts.upper) pools.push('ABCDEFGHIJKLMNOPQRSTUVWXYZ'); if (opts.digits) pools.push('0123456789'); if (opts.symbols) pools.push('!@#$%^&*()-_=+[]{}<>?,.;:'); if (!pools.length) pools.push('abcdefghijklmnopqrstuvwxyz'); return pools; } function _ctPwGen(len, opts) { var pools = _ctPwGenChars(opts); var all = pools.join(''); var buf = new Uint32Array(Math.max(len, pools.length) + 8); if (window.crypto && window.crypto.getRandomValues) { window.crypto.getRandomValues(buf); } else { for (var i = 0; i < buf.length; i++) buf[i] = Math.floor(Math.random() * 0xffffffff); } var pwd = []; var idx = 0; for (var i = 0; i < pools.length && pwd.length < len; i++, idx++) { pwd.push(pools[i].charAt(buf[idx] % pools[i].length)); } while (pwd.length < len) { pwd.push(all.charAt(buf[idx] % all.length)); idx++; } for (var k = pwd.length - 1; k > 0; k--) { var r = buf[(idx + k) % buf.length] % (k + 1); var tmp = pwd[k]; pwd[k] = pwd[r]; pwd[r] = tmp; } return pwd.join(''); } function _ctPwReadOpts() { function checked(id, def) { var el = document.getElementById(id); return el ? !!el.checked : def; } var lenEl = document.getElementById('pwgen-length'); var len = lenEl ? parseInt(lenEl.value, 10) : 16; if (!isFinite(len) || len < 4) len = 16; if (len > 128) len = 128; var lenLabel = document.getElementById('pwgen-length-label'); if (lenLabel) lenLabel.textContent = len; return { len: len, opts: { lower: checked('pwgen-lower', true), upper: checked('pwgen-upper', true), digits: checked('pwgen-digits', true), symbols: checked('pwgen-symbols', false) } }; } function convert(input) { var count = parseInt((input || '').trim(), 10); if (!isFinite(count) || count < 1) count = 1; count = Math.min(count, 200); var cfg = _ctPwReadOpts(); var out = []; for (var i = 0; i < count; i++) out.push(_ctPwGen(cfg.len, cfg.opts)); return out.join('\n'); } $(function(){ $('#pwgen-length, #pwgen-lower, #pwgen-upper, #pwgen-digits, #pwgen-symbols').on('input change', function(){ $('#box1').trigger('keyup'); }); $('#pwgen-regen').on('click', function(){ $('#box1').trigger('keyup'); }); setTimeout(function(){ var box1 = document.getElementById('box1'); if (box1 && !box1.value) { $(box1).val('1').trigger('keyup'); } else { $('#box1').trigger('keyup'); } }, 50); }); var _loadedScripts = {}; function loadScriptPromise(url) { if (_loadedScripts[url]) return _loadedScripts[url]; _loadedScripts[url] = new Promise(function (resolve, reject) { var s = document.createElement('script'); s.src = url; s.onload = resolve; s.onerror = reject; document.head.appendChild(s); }); return _loadedScripts[url]; } function replaceAll(find, replace, str) { return str.replace(new RegExp(find, 'g'), replace); } function beautify(str) { var result = ''; var length = str.length; var i = 0; var braceCountLeft = 0; var braceCountRight = 0; var withinQuotes = false; while (i < length) { var c = str[i]; if (c == '"' && (i == 0 || c[i - 1] != '\\')) { // non-escaped quotes withinQuotes = !withinQuotes; } if (!withinQuotes && (c == '}' || c == '{' || c == ',')) { console.log('Start####' + result); // look back and remove carriage returns and whitespace that are already there var resultIndex = result.length - 1; while (resultIndex >= 0 && (result[resultIndex] == ' ' || result[resultIndex] == '\r' || result[resultIndex] == '\n' || result[resultIndex] == '\t')) { resultIndex = resultIndex - 1; result = result.substr(0, resultIndex + 1); console.log('char ' + result[resultIndex] + '-----' + result + 'zzz ' + result.length + ' ' + resultIndex); } if (c == '{') { braceCountLeft++; result += c + '\r' + GetTabs(braceCountLeft - braceCountRight); } else if (c == '}') { braceCountRight++; // precede with carriage return result += '\r' + GetTabs(braceCountLeft - braceCountRight) + c; } else if (c == ',') { result += c + '\r' + GetTabs(braceCountLeft - braceCountRight); } var nextChar = ''; // advance through whitespace and remove carriage returns that are already there while (i < length && (str[i + 1] == ' ' || str[i + 1] == '\r' || str[i + 1] == '\n' || str[i + 1] == '\t')) { i++; } } else { result += str[i]; } i++; } return result; } function GetTabs(count) { var result = ''; for (var i = 0; i < count; i++) { result += ' '; } return result; }